目次

Mac OS Xのフォントマネージャには、広範囲にわたるフォント技術やデータフォーマットをサポートしやすくする簡単かつ高度な機能があります。プログラミングインターフェイスは、パフォーマンス、スケーラビリティ、および整合性を念頭において設計されており、Mac OS X上でApple Type Services(ATS)フレームワークや Quickdrawフレームワークを介してCocoaやCarbonアプリケーションに使用することもできます。

[2001年7月11日]






フォントのインストール方法

フォントは簡単にインストールできます。Mac OS X 上のファイルシステムにある標準フォントディレクトリにファイルをコピーまたは移動するだけです。ファイルシステムのディレクトリは、ユーザのコンピュータ専用のリソースがネットワークリソースと区別されるように、また、コンピュータ上では、システムリソースがユーザやシステムアドミニストレータの管理下にあるリソースと区別して配置されているので注意してください。アプリケーション、文書、フォント、およびその他のリソースは、複数あるファイルシステムドメインの中の1つにまとめます。このドメインは、他のドメインとは独立したファイルシステムエリアですが、構成要素は他のドメインと同じです。

フォントディレクトリの変更内容は、アプリケーションの起動時、または変更を行ったアカウントまたはコンピュータにユーザがログインしたときに、オペレーティングシステムに登録されます。また、フォントが重複する場合は、標準ドメインに定義されている優先順位の高い順に処理します。表1にその順序を降順で示します。


‾/Library/Fonts(ユーザ)

User は、システムにログインしたユーザ専用のドメインであり、ユーザのホームディレクトリに対応しています。これは、ブートボリュームまたはネットワークのどちらかに存在します。このドメインの内容に関する管理は全てユーザが行います。

/Library/Fonts(ローカル)

Local は、このコンピュータを使用するすべてのユーザが共用するフォント用のドメインであり、オペレーティングシステムからみて必須ではありません。このドメインでは、システムアドミニストレータの権限を持つユーザでなければ、項目の追加、削除、変更をすることができません。また、このドメインは、アプリケーション間で共用されるフォントの定義域として使用することを推奨します。

/Network/Library/Fonts(ネットワーク)

Network は、ローカルエリアネットワークを使用するすべてのユーザが共有するフォント用のドメインです。このドメインの内容は、通常はネットワークファイルサーバに存在するものであり、ネットワークアドミニストレータが管理します。

/System/Library/Fonts(システム)

System ドメインには、オペレーティングシステムの起動時に必要なデフォルトフォントが格納されています。このドメインの内容を変更することはできません。

[Classic System Folder]/Fonts(Classic)

Classicのシステムフォルダ内の フォント フォルダは、すべてのフォントディレクトリの中で最も優先順位の低いドメインであり、Classic 互換環境が動作していなくてもオペレーティングシステムに登録されます。ただし、Classic互換環境で実行するアプリケーションにこの逆は当てはまらないので、Classic System フォルダの Fonts フォルダ以外のドメインは一切使用できないという点に注意してください。

表1 フォントディレクトリおよび標準ドメイン


フォントを格納するドメインによって、そのフォントの適用範囲およびアクセス可能な範囲が定義されます。例えば、ユーザがカスタムフォントをユーザドメインにインストールすると、そのユーザ専用のフォントとなります。また、アドミニストレータが同じフォントをネットワークドメインにインストールした場合は、ネットワーク上のすべてのユーザがこのフォントを使用できるようになります。

Mac OS Xでは、ファイルシステムの所有権とパーミッションモデルが、旧バージョンまでのオペレーティングシステムと基本的な部分で異なります。このため、フォントのインストール方法や使用方法も異なってきます。ユーザは、ファイルシステムのファイルやディレクトごとに、3つのカテゴリー(オーナ、グループ、その他)に分かれています。また、ファイルやディレクトリへのアクセス許可もユーザタイプごとに3つに分かれています(読込み、書込み、実行)。フォントをインストールするときは、そのフォントに関連するファイルへのアクセス許可がこのドメインに適切なユーザカテゴリーの読込みに設定されているか確認します。

トップへ

フォント技術およびデータフォーマット

Mac OS X でのレンダリング、印刷プレビュー、および印刷にサポートされているフォントテクノロジーとデータフォーマットは表2のとおりです。


Macintosh TrueType フォントスーツケース

Windows TrueType TTF/TTC アウトライン/ビットマップフォント

PostScript OpenType Roman アウトライン/ビットマップフォント

PostScript OpenType CID 中国語/日本語/朝鮮語/ベトナム語用アウトライン/ビットマップフォント

Macintosh ビットマップフォントスーツケース付きPostScript Type 1 アウトラインフォント (LWFN)

Macintosh PostScript Type 1 使用可能フォントスーツケース (SFNT)

Macintosh PostScript Type 1 CID 使用可能フォントスーツケース (SFNT/CID)

表2 フォント技術およびデータフォーマット


注:PostScript Type 1 Multiple Master フォントは、いまのところMac OS X ではサポートされていません。

Mac OS X 上のすべての標準 TrueType システムフォントを使用する .dfont ファイルフォーマットの内容は、ファイルのデータフォークにフォントリソースが格納されている点を除けば、標準フォントスーツケースファイルと同じです。Mac OS X には、Quickdraw アプリケーション用の 'NFNT' ビットマップフォントリソースはサポートされていますが、 'FONT' ビットマップフォントリソースはサポートされていません。'NFNT' ビットマップフォントリソースだけで構成されているフォントファミリーは、Cocoa、Apple Type Services for Unicode Imaging (ATSUI)、および Multilingual Text Editor (MLTE) をベースとしたQuickdraw 以外のアプリケーションでは無視されます。また、メニュー、ウィンドウ、静的で編集可能なテキスト制御などのユーザインターフェースエレメントには適用できません。

Mac OS で中国語/日本語/朝鮮語/ベトナム語フォントを最初にサポートしたときには、'FONT' および 'NFNT' リソースフォーマットに代わる新しいビットマップフォントフォーマットを取り入れる必要がありました。新しいフォーマットのフォントは 'fbit' フォントと呼ばれ、フォントに関する基本情報はそのまま 'FOND' リソースに格納されましたが、ビットマップデータは外部ファイルに格納されました。Mac OS X では、この 'fbit' (丸漢) パッケージフォーマットをサポートする予定がないので、フォントの開発者およびユーザは、TrueType と OpenType フォントに対応する'sbit'形式のビットマップフォントフォーマットを使用するように変更する必要があります。

トップへ

サポートされているプログラミングインターフェース

Mac OS X 上の ATS フレームワークに定義されているプログラミングインターフェースには、オペレーティングシステムのその他のコンポーネント(Quartz、Quickdraw、Cocoa、 ATSUI など)との互換性および最高性能を実現するための各種フォント関連機能が統合されています。ATS フレームワークのインターフェースファイルに宣言されている各機能はCFM ベースアプリケーションの CarbonLib では使用できません。CFM ベースアプリケーションでこれらの機能を使用するには、CarbonFrameworkLib に対するリンクを設定するか、Carbon SDK の CallMachOFramework サンプルコードに記述されている方法に従う必要があります。

Mac OS 9.0 で最初に実装された拡張フォントマネージャ機能は、dyld ベースアプリケーションの場合は Mac OS X 上のQuickdraw フレームワークによってエクスポートされ、CFM ベースアプリケーションの場合は Carbon フレームワークや CarbonLib によってエクスポートされます。Carbon アプリケーションの場合は、プログラミングインターフェースに Mac OS X への移行パスがあります。このパスについては、フォントマネージャ開発者マニュアル(Font Manager 技術文献)にあります。この機能は、Mac OS 8.6以前のシステムソフトウェアでは使用できません。それらのシステムソフトウェアにインストールされた CarbonLib の場合は、どのバージョンでも使用できません。拡張フォントマネージャ機能が導入されているかどうかは、リスト1に示すように、プログラミングインターフェースからエクスポートした任意の記号のアドレスをコードフラグメントマネージャ(Code Fragment Manager)が解釈したかどうかを確認すればわかります。

if ( (UInt32)kUnresolvedCFragSymbolAddress != (UInt32)FMGetGeneration )

... // The extended Font Manager API is implemented.

リスト1 フォントマネージャの拡張機能が導入されているかどうかをチェックするソースコード

トップへ

データタイプの違い

ATSFontFamilyRef (opaqueの32ビットの値)と FMFontFamily (符号付の16ビットの整数)では基本タイプが異なります。したがって、これらのデータタイプを使用するときは、タイプキャストや暗黙的なタイプの変更は避けてください。その代わりに、Quickdraw フレームワークでフォントファミリー参照用に定義した変換機能を使用して、これら2つのデータタイプの生成に伴いソフトウェアに変更や相違点が生じないようにします。

FMFont と ATSUFontID は同じデータタイプで、Quickdraw フレームワークの ATSUI およびフォントマネージャの機能とも互換性があります。ただし、ATSFontRef データタイプを用いるときはやはりQuickdraw フレームワークでフォントリファレンス用に定義した変換機能を使用する必要があります。

トップへ

データアクセス機能の使用

FMGetFontTable と FMGetFontTableDirectory の各機能を介してアクセス可能な情報については、TrueType Reference Manual の TrueType 仕様や、Adobe Type Technology Technical Resources および Microsoft Typography Technical Information ウェブサイトのOpenType 仕様で詳しく説明してあります。

FMGetFontFormat関数は、Quickdraw フレームワークの Fonts.h, の中でフォントテクノロジーに関係するようなラベルが付いている値を返します。kFMTrueTypeFontTechnology ('true') フォーマットタグは、TrueType フォント用に予約されています。kFMPostScriptFontTechnology ('typ1') フォーマットタグは、TrueType や OpenType フォントで使用されるデータフォーマットとマッチする単一のフォントリソース ('sfnt') で構成されている PostScript フォントのクラスを示します。フォントデータは、特定のフォント技術に指定されそのラベルが付いているデータテーブルに存在します。Adobe Font Technical Note 5180 に記載されている PostScript CID-Keyed SFNT フォントファイルフォーマットの例を示します。また、フォントフォーマットタグ 'LWFN' は、Mac OS 上の PostScript Type 1 フォント用の従来型パッケージフォーマットを示します(つまり、補助 PostScript アウトラインファイルが1つまたは複数あるビットマップフォントスーツケース)。

FMGetFontContainer 関数を使用すると、'LWFN' クラスフォント用の PostScript アウトラインファイルではなく、フォントスーツケースを参照します。つまり、PostScript アウトラインファイルに格納されているデータを取得することだけを目的とした機能はないということです。

トップへ

フォント名の使用

Quartz やその他の PostScript ベースソフトウェアでは、LaserWriter プリンタの場合と同様に、常に、'FOND' リソースの PostScript 名や TrueType および OpenType フォントの 'name' テーブルを使ってフォントを参照します。'name' テーブルのフォントファミリー、フォント、およびサブファミリー名は、Cocoa アプリケーションのフォントパネル内の各エントリを定義します。

GetFontName(または FMGetFontFamilyName)によって得られる Quickdraw 名は、はじめはフォントファミリーの 'FOND' リソースのリソース名でした。Quickdraw アプリケーションでは、常にこの名前を使ってフォントファミリーを参照します。また、この名前は、AppendResMenuで生成されるフォントメニューのユーザインターフェースでも使用されます。フォントファミリーの中のコンポーネントフォントを指定するには 、Quickdraw スタイルも必要になるので注意してください。

トップへ

標準フォントメニューの使用

フォントマネージャマニュアル(Font Manager documentation)の Handling the Standard Font Menu の章に示す標準フォントメニュー機能には問題があります。Skia や Hoefler Text のような種類の TrueType フォントは、Quickdraw アプリケーションの標準フォントメニューの形式どおりに階層化されません。

トップへ

フォントデータベースの変更に関する通知機能

現時点では、フォントデータベースの変更に関する通知機能はサポートされていません。ただし、フォントマネージャマニュアルの「FMGeneration データタイプ」に記載されているように、生成カウンタの変更についてのポーリングは可能です。

トップへ

リソースマネージャ使用時に必要な変更

Mac OS X上では、グローバルに共用されているシステムリソースチェーンを介してフォントファイルにアクセスしたり、フォントファイルのリソースフォークにフォントデータを格納したりすることができません。また、フォントファイルに格納されている情報にアクセスする際、GetResource や GetResInfo などのリソースマネージャ機能を使用することができません。ただし、ATS や Quickdraw フレームワークに定義されている一般のデータアクセス機能は使用できます。これらの機能は、ファイルフォーマットやフォント技術とは関係なく動作するようになっているからです。ATS フレームワーク定義の機能で、'FOND' リソースに格納されているデータに最も近い情報が得られるのは、 ATSFontFamilyFindFromName、ATSFontFamilyGetName、ATSFontFamilyGetEncoding、およびATSFontGetPostScriptName です。ATSFontGetHorizontalMetrics 関数は、'FOND' リソースにあるすべてのフォントファミリーメトリックスを提供するのではなく、コンポーネントフォントに格納されているデータテーブルを基にして処理するので注意してください。

リソースベースソースコードを Mac OS X で使えるようにするための追加情報は、フォントマネージャマニュアルの "Rewriting Resource-based Code" の章を参照してください。

ATS フレームワークのインターフェースファイル ATSFont.h, に定義されている ATSFontGetFontFamilyResource 関数を使用すると、'FOND' リソースの内容にアクセスし、特定のフォントを参照することができます。この関数では、'FOND' リソースの内容をデータバッファにコピーすることができます(データバッファは、この関数を使用する前に割り当てておく必要があります)。データバッファパラメータをゼロに設定して ATSFontGetFontFamilyResource を呼び出すと、'FOND' リソースデータを保持するのに必要なバッファのサイズがバッファサイズパラメータに返されます。この情報により必要なバッファを割り当てることができます。

Macintosh TrueType フォントスーツケースのその他のフォントリソース(アウトライン ('sfnt') およびビットマップ ('NFNT') フォントリソースを含む)にアクセスするには、FMGetFontContainer を使ってファイルリファレンスを取得します。このファイルリファレンスは、ファイルを開いたり、リソースデータに直接アクセスしたりするリソースマネージャ機能に渡されます。リスト2のソースコードは、Mac OS X および Mac OS 9 上の 'FOND' リソースにアクセスするための基本的なサポート機能を示します。サンプルコードは、拡張フォントマネージャ機能によって異なるものであり、このプログラミングインターフェースをサポートしていない旧リリース以前のシステムソフトウェアでは使用できないので注意してください。

OSStatus GetFontFamilyResource(FMFontFamily iFontFamily, Handle* oHandle) {
    FMFont font;
    Str255 fontFamilyName;
    SInt16 rsrcFRefNum;
    Handle rsrcHandle;
    FSSpec rsrcFSSpec;
    FSRef rsrcFSRef;
    HFSUniStr255 forkName;
    OSStatus status;

    font = kInvalidFont;
    rsrcFRefNum = -1;
    rsrcHandle = NULL;
    status = noErr;


    /* 'FOND' リソースの取込時にリソースマネージャで使用するフォントファミリー名を
       取得します。*/
    status = FMGetFontFamilyName(iFontFamily, fontFamilyName);
    require(status == noErr, FMGetFontFamilyName_Failed);

    /* フォントファミリーコンテナのファイル仕様を取得するためフォントファミリーの
       コンポーネントフォントを取り込みます。*/
    status = FMGetFontFromFontFamilyInstance(iFontFamily, 0, &font, nil);
    require(status == noErr && font != kInvalidFont,
        FMGetFontFromFontFamilyInstance_Failed);

    status = FMGetFontContainer(font, &rsrcFSSpec);
    require(status == noErr, FMGetFontContainer_Failed);

    /* ファイルのリソースフォークを開きます。*/
    rsrcFRefNum = FSpOpenResFile(&rsrcFSSpec, fsRdPerm);

    /* フォントが ".dfont" ファイルフォーマットを基にしている場合は、ファイルの
       データフォークを開く必要があります。*/
    if ( rsrcFRefNum == -1 ) {
 
        /* ファイルのデータフォークを開くには標準フォーク名が必要です。*/
        status = FSGetDataForkName(&forkName);
        require(status == noErr, FSGetDataForkName_Failed);

        /* ファイルのデータフォークを開くには、ファイル仕様 (FSSpec) を
           ファイルリファレンス (FSRef) に変換する必要があります。*/
        status = FSpMakeFSRef(&rsrcFSSpec, &rsrcFSRef);
        require(status == noErr, FSpMakeFSRef_Failed);

        status = FSOpenResourceFile(&rsrcFSRef,
            forkName.length, forkName.unicode,
            fsRdPerm, &rsrcFRefNum);
        require(status == noErr, FSOpenResourceFile_Failed);
    }

    UseResFile(rsrcFRefNum);

        /* Mac OS X上では、フォントの重複や競合が解消された後
           にフォントファミリー識別子とリソース識別子が一致することはありません。*/
    rsrcHandle = Get1NamedResource(FOUR_CHAR_CODE('FOND'), fontFamilyName);
    require_action(rsrcHandle != NULL,
        Get1NamedResource_Failed, status = ResError());

    DetachResource(rsrcHandle);

Get1NamedResource_Failed:

    if ( rsrcFRefNum != -1 )
        CloseResFile(rsrcFRefNum);

FSOpenResourceFile_Failed:
FSpMakeFSRef_Failed:
FSGetDataForkName_Failed:
FMGetFontContainer_Failed:
FMGetFontFromFontFamilyInstance_Failed:
FMGetFontFamilyName_Failed:

    if ( oHandle != NULL )
        *oHandle = rsrcHandle;

    return status;
}

リスト2 リソースベースのフォントスーツケースファイルに格納されているフォント情報にアクセスするためのソースコード

FMGetFontFromFontFamilyInstance 関数を使ってフォントファミリーインスタンスをフォントリファレンスに変換した後、FMGetFontFamilyInstanceFromFont を使ってその反対の操作を行っても、必ず元のフォントファミリーインスタンスになるわけではありません。特に、複数のフォントファミリーが参照したフォントを処理する場合は、明らかにこのような問題が発生します。また、暗黙的にフォントリファレンスをフォントファミリーインスタンスに変換する ATSFontGetFontFamilyResource や FMGetFontContainer などの関数を使用した場合でもこのような問題が発生することがあります。リスト3に示すように、FMGetFontFromFontFamilyInstance 変換機能によって提供された固有の(intrinsic)スタイルを基にして実際の(effective)スタイルを決定した結果得られたフォントファミリーインスタンスに何らかの相違がみられる場合には、ユーザが調整できます。

FMGetFontFromFontFamilyInstance(originalFamily, originalStyle,
    &font, &intrinsicStyle);

remainingStyle = originalStyle & ‾intrinsicStyle;

FMGetFontFamilyInstanceFromFont(font, &newFamily, &newStyle);
if ( newFamily != originalFamily )
    effectiveStyle = newStyle | remainingStyle;
else
    effectiveStyle = originalStyle;

リスト3 複数のフォントファミリーが参照したフォントを処理する場合のソースコード

このリストでは、FMGetFontFamilyInstanceFromFont 関数が選択したフォントファミリーと、データアクセス機能が選択したフォントファミリーが同一ということになっています。フォントファミリーが異なる場合は、新しいフォントファミリーのインスタンスを列挙して、このフォントを参照するインスタンスをさがし、必要に応じてスタイルを調整します。

Mac OS X では、リソースマネージャがアプリケーションファイルのリソースフォークに格納されているフォントを自動的にアクティブにすることはありません。ファイルのリソースフォークに格納されているフォントをアクティブにするには、アプリケーションのファイル仕様と共に、FMActivateFonts(Quickdraw フレームワークの Fonts.h )または ATSFontActivateFromFileSpecification(ATS フレームワークの ATSFont.h)を使用します。

AddResMenu 関数は、サポートされているすべてのデータフォーマット、特に PostScript OpenType や Windows TrueType フォントなどの非リソースフォークベースフォントを処理できるように修正されました。

トップへ

Quickdraw 使用時に必要な変更

Mac OS X でも、フォントマネージャルーチンの FMSwapFont を使って、Quickdraw が生成したフォント情報にアクセスすることができますが、リソースベースデータハンドルを参照するデータ構成のフィールドにはアクセスできなくなります。つまり、FMOutput データ構成の fontHandle フィールドや WidthTable データ構成の tabFont および fHand フィールドです。これらのフィールドは、フォントマネージャによってゼロに設定されます。

HIToolbox フレームワークが初期設定されていない場合は、GetSysFont や GetAppFont などの関数でデフォルトシステムフォント用のスクリプトシステムデータにアクセスしたり、戻り値をゼロに設定したりすることはできません。この問題は、GetApplicationTextEncoding などの HIToolbox でエクスポートされるアプリケーションの機能を参照することで解決できます。

トップへ